package com.zjdiepu.www.common.util;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * 字符串操作工具<br/>
 * 1.判断空<br/>
 * 2.判断非空<br/>
 * 3.创建特定字符串<br/>
 * 4.截取/替换字符串<br/>
 * @author xiongxiaotun
 * @date 2017年3月3日 下午1:49:04
 * @since v1.0.0
 * @update
 */
public class StringUtil implements Serializable{
	private static final long serialVersionUID = 1L;
	/**
	 * A String for undefined from front
	 *
	 * @since 1.0.0
	 */
	public static final String UNDEFINED = "undefined";
	/**
	 * A String for null from front
	 *
	 * @since 1.0.0
	 */
	public static final String NULL = "null";
	/**
	 * A String for *
	 *
	 * @since 1.0.0
	 */
	public static final String ASTERISK = "*";
	
	/**
	 * A String for .
	 *
	 * @since 1.0.0
	 */
	public static final String PERIOD = ".";
	
	/**
	 * A String for zero
	 *
	 * @since 1.0.0
	 */
	public static final String STRING_ZERO = "0";
	/**
	 * A String for empty
	 *
	 * @since 1.0.0
	 */
	public static final String EMPTY = "";
	/**
	 * A String for under score
	 *
	 * @since 1.0.0
	 */
	public static final String UNDER_SCORE = "_";
	/**
	 * a part of numbers and letters
	 */
	public static final String[] LETTERS = new String[] { "2", "3", "4", "5", "6", "7",  
            "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",  
            "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",  
            "W", "X", "Y", "Z" };  

	/**
	 * 是否包含空字符串:前端参数非空<br/>
	 * 
	 * @author xiongxiaotun
	 * @date 2017年3月3日 下午1:50:44
	 * @since v1.0.0
	 * @update
	 * @param str
	 * @return
	 */
	public static boolean hasFrontBlank(String... strs) {
		return !hasNoneFrontBlank(strs);
	}

	/**
	 * 是否包含空字符串:前端参数非空<br/>
	 * 
	 * @author xiongxiaotun
	 * @date 2017年3月3日 下午1:50:44
	 * @since v1.0.0
	 * @update
	 * @param str
	 * @return
	 */
	public static boolean hasNoneFrontBlank(String... strs) {
		if (ArrayUtils.isEmpty(strs)) {
			return false;
		}
		for (String str : strs) {
			if (isFrontBlank(str)) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 是否为非空字符串:前端参数非空<br/>
	 * 
	 * @author xiongxiaotun
	 * @date 2017年3月3日 下午1:50:44
	 * @since v1.0.0
	 * @update
	 * @param str
	 * @return
	 */
	public static boolean isNotFrontBlank(String str) {
		return !isFrontBlank(str);
	}

	/**
	 * 是否为空字符串:前端参数空<br/>
	 * 
	 * @author xiongxiaotun
	 * @date 2017年3月3日 下午1:50:44
	 * @since v1.0.0
	 * @update
	 * @param str
	 * @return
	 */
	public static boolean isFrontBlank(String str) {
		boolean isBlank = StringUtils.isBlank(str);
		if (isBlank) {
			return true;
		}
		str = str.trim();
		str = str.toLowerCase();
		return UNDEFINED.equals(str) || NULL.equals(str);
	}

	/**
	 * 获取n个字符的串:默认n个*<br/>
	 *
	 * @author xiongxiaotun<br/>
	 * @date 2017年3月3日 下午2:37:08
	 * @since v1.0.0
	 * @update
	 * @param n 
	 * 			个数
	 */
	public static String createNCharStr(int n) {
		return createNCharStr(n, null);
	}

	/**
	 * 获取n个字符的串<br/>
	 *
	 * @author xiongxiaotun<br/>
	 * @date 2017年3月3日 下午2:37:08
	 * @since v1.0.0
	 * @update
	 * @param n 
	 * 			个数
	 * @param specifiedStr
	 *            指定的串
	 */
	public static String createNCharStr(int n, String specifiedStr) {
		StringBuilder sb = new StringBuilder();
		if (StringUtils.isBlank(specifiedStr)) {
			specifiedStr = ASTERISK;
		}
		for (int i = 0; i < n; i++) {
			sb.append(specifiedStr);
		}
		return sb.toString();
	}

	/**
	 * 保留头尾，替换中间字符为新字符<br/>
	 * 
	 * @param source
	 *            源字符串
	 * @param nHeads
	 *            开头位数
	 * @param mTails
	 *            结尾位数
	 * @param replaceChar
	 *            替代字符
	 * @return
	 * @author xiongxiaotun
	 * @time 2016年12月17日
	 * @since v1.0.0
	 * @update
	 */
	public static String subWithNHeadMTail(String source, int nHeads, int mTails, String replaceChar) {
		if (StringUtils.isBlank(source)) {
			return StringUtils.EMPTY;
		}

		if (source.length() <= nHeads + mTails) {
			return source;
		}
		int length = source.length();
		String prefix = source.substring(0, nHeads);
		String middle = source.substring(nHeads, length - mTails);
		String subfix = source.substring(length - mTails, length);

		return StringUtils.isBlank(replaceChar) ? (prefix + subfix)
				: (prefix + createNCharStr(middle.length(), replaceChar) + subfix);
	}
	
	/**
	 * 生成n为随机字符串
	 * @param n
	 * @return
	 */
	public static String createRandomStr(int n){
	        List<String> beforeShuffle = Arrays.asList(LETTERS);  
	        Collections.shuffle(beforeShuffle);  
	        StringBuilder sb = new StringBuilder();  
	        for (int i = 0; i < n; i++) {  
	            sb.append(beforeShuffle.get(i));  
	        }  
	        String afterShuffle = sb.toString();  
	        return afterShuffle;  
	}
	
	/**
	 * 获取属性方法：getter
	 *
	 * @author xiongxiaotun
	 * @date 2017年3月6日 上午9:19:13
	 * @since v1.0.0
	 * @update
	 * @param fieldName
	 */
	public static String getFieldMethod(String fieldName) {
		return getFieldMethod(fieldName, false);
		
	}
	
	
	/**
	 * 获取属性方法：getter
	 *
	 * @author xiongxiaotun
	 * @date 2017年3月6日 上午9:19:13
	 * @since v1.0.0
	 * @update
	 * @param fieldName
	 * @param isBoolean 是否为boolean（基本类型）
	 */
	public static String getFieldMethod(String fieldName, boolean isBoolean) {
		if(StringUtils.isBlank(fieldName)) {
			return null;
		}
		if(isBoolean) {
			return "is" + StringUtils.capitalize(fieldName);
		} else {
			return "get" + StringUtils.capitalize(fieldName);
		}
	}
	
	/**
	 * 获取属性方法：setter
	 *
	 * @author xiongxiaotun
	 * @date 2017年3月6日 上午9:19:13
	 * @since v1.0.0
	 * @update
	 * @param fieldName
	 */
	public static String setFieldMethod(String fieldName) {
		if(StringUtils.isBlank(fieldName)) {
			return null;
		}
		return "set" + StringUtils.capitalize(fieldName);
		
	}
	
	/**
	 * @author xiongxiaotun <br/>
	 * @Title: to  <br/>
	 * @Description: 获取带下划线的字段名称 <br/>
	 * @param fieldName
	 * @return
	 * @version V1.0  <br/>
	 */
	public static String toColumnsName(String fieldName) {
		if(StringUtils.isBlank(fieldName)) {
			return null;
		}
		fieldName = fieldName.trim();
		StringBuilder sb = new StringBuilder();
		int indexOf = fieldName.indexOf(PERIOD);
		if(indexOf > 0) {
			sb.append(fieldName.substring(0, indexOf + 1));
			fieldName = fieldName.substring(indexOf + 1);
		}
		sb.append("`");
		for(String c : fieldName.split(EMPTY)) {
			if(Character.isUpperCase(c.charAt(0))) {
				sb.append(UNDER_SCORE);
			}
			sb.append(c.toLowerCase());
		}
		sb.append("`");
		return sb.toString().toUpperCase();
	}
}
